package  com.tool.excel.utils  ;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;



public class ExcelUtils {

    static  String  excel_template_path="rs_apply_vm_info__template.xlsx" ;

    public  static void main(String args[]) throws IOException {
        List<Object> list=new ArrayList<Object>() ;
        try {
            InputStream fin=ExcelUtils.class.getClassLoader().getResourceAsStream(excel_template_path);
            //写数据到这个路径上
            FileOutputStream excelFileOutPutStream = new FileOutputStream("C://Users//kevin_Pad//Desktop//测试.xlsx");
            creatApplyVMInfo(fin,excelFileOutPutStream) ;
            System.out.println(fin.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("运行结束");

    }
    /**
     *
     * @Description TODO(这里用一句话描述这个方法的作用)
     * @author lpf
     * @date 2018-9-29 下午1:18:38
     * @param fin   模板文件
     * @param fout  输出文件
     */
    public static void creatApplyVMInfo(String fin,String fout){
        try {
            FileInputStream excelFileInputStream = new FileInputStream(fin);
            XSSFWorkbook workbook = new XSSFWorkbook(excelFileInputStream);//拿到文件转化为javapoi可操纵类型
            excelFileInputStream.close();
            XSSFSheet sheet = workbook.getSheetAt(0);
            XSSFCellStyle style =  workbook.createCellStyle();
            sheet.setDisplayGridlines(false);//设置不显示excel网格线
           // style.setFillPattern(XSSFCellStyle.FINE_DOTS );
            style.setFillBackgroundColor(IndexedColors.PINK.index);
            //XSSFRow row  ;//= sheet.getRow(0);//得到行
            //XSSFCell cell ;// = row.getCell(6);//得到列
            //设置申请单表头
            sheet.getRow(0).getCell(6).setCellValue("2018公共服务中心网站项目"+"云资源需求单") ;
            //设置建设单位
            sheet.getRow(1).getCell(3).setCellValue("建设单位："+"经济与信息化委员会") ;
            //设置项目名称和项目编号
            sheet.getRow(2).getCell(3).setCellValue("项目名称："+"经济与信息化委员会") ;
            sheet.getRow(2).getCell(7).setCellValue("项目编号："+"CP2018092900000001") ;
            //设置联系人和联系电话
            sheet.getRow(3).getCell(3).setCellValue("联系人："+"雷鹏飞") ;
            sheet.getRow(3).getCell(7).setCellValue("联系电话："+"15650799296") ;
            int length=20;
            if(length>1){
                copyRows(7,7,length+5+2,sheet) ;
                if(length==2){
                    sheet.getRow(7).getCell(2).setCellValue("") ; //技术支持：
                    sheet.getRow(7).getCell(6).setCellValue("") ; //华为电话
                    sheet.getRow(7).getCell(8).setCellValue("") ; //中软电话
                }
            }

            for(int i=0 ;i<length ;i++){
                XSSFRow xssRow=sheet.getRow(i+5) ;
                xssRow.getCell(1).setCellValue(i+1) ; //序号
                xssRow.getCell(2).setCellValue("虚拟机1") ; //申请类型
                xssRow.getCell(3).setCellValue("16") ; //cpu数量
                xssRow.getCell(4).setCellValue("32") ; //内存
                xssRow.getCell(5).setCellValue("500") ; //硬盘
                xssRow.getCell(6).setCellValue("Linux 操作系统") ; //操作系统
                xssRow.getCell(7).setCellValue("信息化中心网站") ; //用途
                xssRow.getCell(8).setCellValue("门户") ; //备注
                if(i!=length-1){
                    copyRows(i+5,i+5,i+6,sheet) ;
                }
            }
            //设置技术支持
            sheet.getRow(length+5+1).getCell(2).setCellValue("技术支持电话：") ; //技术支持：
            sheet.getRow(length+5+1).getCell(6).setCellValue("华为  133XXXXXXXXXX") ; //华为电话
            sheet.getRow(length+5+1).getCell(8).setCellValue("中软   133XXXXXXXXX") ; //中软电话
            FileOutputStream excelFileOutPutStream = new FileOutputStream(fout);//写数据到这个路径上
            workbook.write(excelFileOutPutStream);
            excelFileOutPutStream.flush();
            excelFileOutPutStream.close();
            System.out.println("虚拟机信息导入完毕！！！");

        } catch (Exception  e) {
            e.printStackTrace();
        }

    }
    /**
     *
     * @Description TODO(把申请的虚拟机信息导入的excel中)
     * @author lpf
     * @date 2018-9-29 下午1:18:38
     * @param fin   excel模板输入流
     * @param fout  虚拟机信息输出流
     */
    public static void creatApplyVMInfo(InputStream fin,OutputStream fout){
        try {

            XSSFWorkbook workbook = new XSSFWorkbook(fin);//拿到文件转化为javapoi可操纵类型
            fin.close();
            XSSFSheet sheet = workbook.getSheetAt(0);
            XSSFCellStyle style =  workbook.createCellStyle();
            sheet.setDisplayGridlines(false);//设置不显示excel网格线
           // style.setFillPattern(XSSFCellStyle.FINE_DOTS );
            style.setFillBackgroundColor(IndexedColors.PINK.index);
            //XSSFRow row  ;//= sheet.getRow(0);//得到行
            //XSSFCell cell ;// = row.getCell(6);//得到列
            //设置申请单表头
            sheet.getRow(0).getCell(6).setCellValue("2018公共服务中心网站项目"+"云资源需求单") ;
            //设置建设单位
            sheet.getRow(1).getCell(3).setCellValue("建设单位："+"经济与信息化委员会") ;
            //设置项目名称和项目编号
            sheet.getRow(2).getCell(3).setCellValue("项目名称："+"经济与信息化委员会") ;
            sheet.getRow(2).getCell(7).setCellValue("项目编号："+"CP2018092900000001") ;
            //设置联系人和联系电话
            sheet.getRow(3).getCell(3).setCellValue("联系人："+"雷鹏飞") ;
            sheet.getRow(3).getCell(7).setCellValue("联系电话："+"15650799296") ;
            int length=20;
            if(length>1){
                copyRows(7,7,length+5+1,sheet) ;
                if(length==2){
                    sheet.getRow(7).getCell(2).setCellValue("") ; //技术支持：
                    sheet.getRow(7).getCell(6).setCellValue("") ; //华为电话
                    sheet.getRow(7).getCell(8).setCellValue("") ; //中软电话
                }
            }

            for(int i=0 ;i<length ;i++){
                XSSFRow xssRow=sheet.getRow(i+5) ;
                xssRow.getCell(1).setCellValue(i+1) ; //序号
                xssRow.getCell(2).setCellValue("虚拟机1") ; //申请类型
                xssRow.getCell(3).setCellValue("16") ; //cpu数量
                xssRow.getCell(4).setCellValue("32") ; //内存
                xssRow.getCell(5).setCellValue("500") ; //硬盘
                xssRow.getCell(6).setCellValue("Linux 操作系统") ; //操作系统
                xssRow.getCell(7).setCellValue("信息化中心网站") ; //用途
                xssRow.getCell(8).setCellValue("门户") ; //备注
                if(i!=length-1){
                    copyRows(i+5,i+5,i+6,sheet) ;
                }
            }
            //设置技术支持
           /* sheet.getRow(length+5+1).getCell(2).setCellValue("技术支持电话：") ; //技术支持：
            sheet.getRow(length+5+1).getCell(6).setCellValue("华为  133XXXXXXXXXX") ; //华为电话
            sheet.getRow(length+5+1).getCell(8).setCellValue("中软   133XXXXXXXXX") ; //中软电话*/
            workbook.write(fout);
            fout.flush();
            fout.close();
            System.out.println("虚拟机信息导入完毕");

        } catch (Exception  e) {
            e.printStackTrace();
        }

    }
    /**
     *
     * @Description TODO(把申请的虚拟机信息导入的excel中)
     * @author lpf
     * @date 2018-9-29 下午1:18:38
     * @param fin   excel模板输入流
     * @param fout  虚拟机信息输出流
     */
    /*public static void creatApplyVMInfo(InputStream fin,OutputStream fout,RsApplyVmInfo rsApplyVmInfo){
        try {

            XSSFWorkbook workbook = new XSSFWorkbook(fin);//拿到文件转化为javapoi可操纵类型
            fin.close();
            XSSFSheet sheet = workbook.getSheetAt(0);
            XSSFCellStyle style =  workbook.createCellStyle();
            sheet.setDisplayGridlines(false);//设置不显示excel网格线
            //style.setFillPattern(XSSFCellStyle.FINE_DOTS );
            style.setFillBackgroundColor(IndexedColors.PINK.index);
            //XSSFRow row  ;//= sheet.getRow(0);//得到行
            //XSSFCell cell ;// = row.getCell(6);//得到列
            //设置申请单表头
            sheet.getRow(0).getCell(6).setCellValue(rsApplyVmInfo.getProname().trim()+"项目云资源需求单") ;
            //设置建设单位
            sheet.getRow(1).getCell(3).setCellValue("建设单位："+rsApplyVmInfo.getOrgName()) ;
            //设置项目名称和项目编号
            sheet.getRow(2).getCell(3).setCellValue("项目名称："+rsApplyVmInfo.getProname()) ;
            sheet.getRow(2).getCell(7).setCellValue("项目编号："+rsApplyVmInfo.getProno()) ;
            //设置联系人和联系电话
            sheet.getRow(3).getCell(3).setCellValue("联系人："+rsApplyVmInfo.getDomainUrl()) ;
            sheet.getRow(3).getCell(7).setCellValue("联系电话："+rsApplyVmInfo.getDeployVdcNm()) ;
            List<RsApplyVMware> vmlist=rsApplyVmInfo.getVmInfos() ;
            int length=vmlist.size();
            if(length>1){
                copyRows(7,7,length+5+1,sheet) ;
                if(length==2){
                    sheet.getRow(7).getCell(2).setCellValue("") ; //技术支持：
                    sheet.getRow(7).getCell(6).setCellValue("") ; //华为电话
                    sheet.getRow(7).getCell(8).setCellValue("") ; //中软电话
                }
            }

            for(int i=0 ;i<vmlist.size() ;i++){
                RsApplyVMware rv=vmlist.get(i) ;
                XSSFRow xssRow=sheet.getRow(i+5) ;
                xssRow.getCell(1).setCellValue(i+1) ; //序号
                xssRow.getCell(2).setCellValue(rv.getVmType()) ; //申请类型
                xssRow.getCell(3).setCellValue(rv.getCpu()) ; //cpu数量
                xssRow.getCell(4).setCellValue(rv.getMem()) ; //内存
                xssRow.getCell(5).setCellValue(rv.getDiskSize()) ; //硬盘
                xssRow.getCell(6).setCellValue(rv.getOsType()) ; //操作系统
                xssRow.getCell(7).setCellValue(rv.getVmNm()) ; //用途
                xssRow.getCell(8).setCellValue(rv.getOsVersion()) ; //备注
                rv=null ;
                if(i!=length-1){
                    copyRows(i+5,i+5,i+6,sheet) ;
                }
            }
            //设置技术支持
            if(vmlist.size()!=0){
                sheet.getRow(length+5+1).getCell(2).setCellValue("技术支持电话：") ; //技术支持：
                sheet.getRow(length+5+1).getCell(6).setCellValue("华为  "+rsApplyVmInfo.getHwphone()) ; //华为电话
                sheet.getRow(length+5+1).getCell(8).setCellValue("中软  "+rsApplyVmInfo.getZrphone()) ; //中软电话
            }
            workbook.write(fout);
            fout.flush();
            fout.close();
            System.out.println("虚拟机信息导入完毕");

        } catch (Exception  e) {
            e.printStackTrace();
        }

    }*/


    public static void copyRows(int startRow, int endRow, int pPosition,
                                XSSFSheet sheet) {
        int pStartRow = startRow - 1;
        int pEndRow = endRow - 1;
        int targetRowFrom;
        int targetRowTo;
        int columnCount;
        CellRangeAddress region = null;
        int i;
        int j;
        if (pStartRow == -1 || pEndRow == -1) {
            return;
        }
        // 拷贝合并的单元格
        for (i = 0; i < sheet.getNumMergedRegions(); i++) {
            region = sheet.getMergedRegion(i);
            if ((region.getFirstRow() >= pStartRow)&& (region.getLastRow() <= pEndRow)) {
                targetRowFrom = region.getFirstRow() - pStartRow + pPosition;
                targetRowTo = region.getLastRow() - pStartRow + pPosition;
                CellRangeAddress newRegion = region.copy();
                newRegion.setFirstRow(targetRowFrom);
                newRegion.setFirstColumn(region.getFirstColumn());
                newRegion.setLastRow(targetRowTo);
                newRegion.setLastColumn(region.getLastColumn());
                sheet.addMergedRegion(newRegion);
            }
        }
        // 设置列宽
        for (i = pStartRow; i <= pEndRow; i++) {
            XSSFRow sourceRow = sheet.getRow(i+1);
            columnCount = sourceRow.getLastCellNum();
            if (sourceRow != null) {
                XSSFRow newRow = sheet.createRow(pPosition - pStartRow + i);
               // newRow.setHeight(sourceRow.getHeight());
                for (j = 0; j < columnCount; j++) {
                    XSSFCell templateCell = sourceRow.getCell(j);
                    if (templateCell != null) {
                        XSSFCell newCell = newRow.createCell(j);
                        copyCell(templateCell, newCell);
                    }
                }
            }
        }
    }


    private static void copyCell(XSSFCell templateCell, XSSFCell newCell) {
        newCell.setCellStyle(templateCell.getCellStyle());
        if (templateCell.getCellComment() != null) {
            newCell.setCellComment(templateCell.getCellComment());
        }
        int cellType= templateCell.getCellType();
        if (cellType == XSSFCell.CELL_TYPE_NUMERIC) {
            newCell.setCellValue(templateCell.getNumericCellValue());
        } else if (cellType == XSSFCell.CELL_TYPE_STRING) {
            newCell.setCellValue(templateCell.getRichStringCellValue());
        } else if (cellType == XSSFCell.CELL_TYPE_BLANK) {

        } else if (cellType == XSSFCell.CELL_TYPE_BOOLEAN) {
            newCell.setCellValue(templateCell.getBooleanCellValue());
        } else if (cellType == XSSFCell.CELL_TYPE_ERROR) {
            newCell.setCellErrorValue(templateCell.getErrorCellValue());
        } else if (cellType == XSSFCell.CELL_TYPE_FORMULA) {
            newCell.setCellFormula(templateCell.getCellFormula());
        } else { // nothing

        }
    }



}
